package com.chenziwen.scala.chapter04

import util.control.Breaks._

object Scala05_Control {

  def main(args: Array[String]): Unit = {

    // 逻辑判断 if else
    // if else 条件表达式有结果，具体的返回结果的值取决于'满足条件的代码的最后一行的结果'
    // 如果判断逻辑中返回的结果类型相同，那么变量结果类型能够自动推断出来，如果结果类型不相同，那么会设定类型为Any
    // 脑海中一定要记得Scala中的类型继承关系图

    // 注：如果大括号内的逻辑代码只有一行，大括号可以省略

    val i = 1
    val result = if (i == 1) {
      println("i = 1")
    } else {
      println("i != 1")
      "bob"
    }
    println(result)


    // While表达式
    // While语句本身没有值，即整个While语句的结果是Unit类型的()
    var n = 1
    val whileResult = while (n <= 10) {
      n += 1
    }
    println(n)
    println(whileResult)


    // 可中断函数
    // 函数的参数列表可以使用大括号来代替小括号（其实两者都可以，只是在编程习惯中，当小括号中有多行逻辑是，使用大括号换行，逻辑更清晰）
    // 将一段逻辑代码作为参数传给另一个方法，这个函数称之为高阶函数
    // lambda表达式（运算）  ==> 匿名函数 ==> 将一段代码传递给另外一个方法

    // breakable() 其实是一个方法，它接收一段代码作为参数
    // 所谓break方法，其实就是抛出异常，让breakable方法返回
    var m = 1
    breakable(
      while (m <= 20) {
        m += 1
        if (m == 18) {
          break()
        }
      }
    )
    println("m = " + m)


    // for循环

    // to 前闭后闭
    for (i <- 1 to 5) {
      // 12345
      print(i)
    }
    println("\n---------------")
    // 前闭后开
    for (i <- i until 5) {
      // 1234
      print(i)
    }
    println("\n---------------")
    // 循环守卫：保护式为（(if i != 3)）true，则进入循环体内部，为false则跳过，类似于continue
    for (i <- i to 5 if i != 3) {
      print(i)
    }
    println("\n---------------")
    // 引入变量
    for (i <- 1 to 5; j = 6 - i) {
      print(i * j + "")
    }
    println("\n---------------")
    // 嵌套循环
    for (i <- 1 to 5; j <- 1 to 5) {
      println(i + "*" + j + "=" + i * j)
    }
    println("\n---------------")
    // 循环返回值
    val forResultList = for (i <- 1 to 10) yield i
    println(forResultList)

    println("\n---------------")
    // 使用花括号代替小括号：当表达式有多条时，使用花括号，这样可读性强

  }


}
